package com.sc.nft.dao;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.sc.nft.entity.SaasTask;
import com.sc.nft.entity.SaasUserTask;
import com.sc.nft.entity.UserInfo;
import com.sc.nft.entity.dto.*;
import com.sc.nft.entity.vo.SaasTaskBasicsVO;
import com.sc.nft.entity.vo.SaasTaskWebPageVO;
import com.sc.nft.entity.vo.SaasUserTaskParticipatingTaskVO;
import com.sc.nft.enums.SaasTaskConfigurationEnum;
import com.sc.nft.enums.SaasTaskTypeEnum;
import com.sc.nft.mapper.SaasTaskMapper;
import com.sc.nft.sup.PageRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.util.List;

/**
 * 任务基础表(SaasTask)表Dao层
 *
 * @author 王伟成
 * @since 2024-01-11 15:07:57
 */
@Slf4j
@Repository
public class SaasTaskDao extends ServiceImpl<SaasTaskMapper, SaasTask> {
    @Resource
    private  UserCreatorInfoDao userCreatorInfoDao;
    @Resource
    private  SaasUserTaskDao saasUserTaskDao;

    public IPage<SaasTaskBasicsVO>pageBasics(SaasTaskBasicsDTO saasTaskBasicsDTO){
        return baseMapper.pageBasics(saasTaskBasicsDTO.toMp(),saasTaskBasicsDTO);
    }
    public void audit(SaasTaskAuditDTO saasTaskAuditDTO) {
        this.lambdaUpdate()
                .eq(SaasTask::getId, saasTaskAuditDTO.getId())
                .set(SaasTask::getTaskConfiguration, saasTaskAuditDTO.getTaskConfiguration())
                .set(SaasTask::getTaskRemark,saasTaskAuditDTO.getTaskRemark())
                .update();
    }
    public IPage<SaasTaskWebPageVO> saasTaskWebPage(SaasTaskWebPageDTO saasTaskWebPageDTO, Long userId, Boolean dao) {
        return baseMapper.saasTaskWebPage(saasTaskWebPageDTO.toMp(), saasTaskWebPageDTO, userId, dao);
    }
    /**
     * 用户参与的任务
     * @param saasUserTaskParticipatingTaskDTO
     * @param user
     * @return
     */
    public IPage<SaasUserTaskParticipatingTaskVO> userParticipatingTask(SaasUserTaskParticipatingTaskDTO saasUserTaskParticipatingTaskDTO, UserInfo user) {
        return baseMapper.userParticipatingTask(saasUserTaskParticipatingTaskDTO.toMp(),saasUserTaskParticipatingTaskDTO,user);
    }

    public void updateByTaskConfigurationNotSubmittedForReview(Long taskId) {
        this.lambdaUpdate().eq(SaasTask::getId, taskId).set(SaasTask::getTaskConfiguration, SaasTaskConfigurationEnum.NOT_SUBMITTED_FOR_REVIEW).update();
    }


    /**
     * 获取有效期内且满足用户的任务,这个功能在MQ消费中使用 调用该方法的人请仔细读取代码后确认是否满足自己当前需求在自行决定是否使用.
     * @return
     */
    public List<SaasTask> getByTaskTypeAndValid(SaasTaskTypeEnum taskType, Long userId) {
        return baseMapper.getByTaskTypeAndValid(taskType.getCode(),userId);
    }
    public Boolean taskSubtract(Long taskId, Integer subtract) {
        return SqlHelper.retBool(baseMapper.taskSubtract(taskId,subtract));
    }
    public List<SaasTask> everydayTask() {
        return baseMapper.everydayTask();
    }
    public List<SaasTask> weeklyTask() {
        return baseMapper.weeklyTask();
    }
    /**
     * 获取星球任务列表
     * @param pageRequest
     * @return
     */
    public IPage<SaasTaskWebPageVO> saasTaskStarWebPage(PageRequest pageRequest) {
        return baseMapper.saasTaskStarWebPage(pageRequest.toMp());
    }
    /**
     * 开启或关闭任务
     * @param saasTaskStartOrEndDTO
     */
    public void updateTaskStatus(SaasTaskStartOrEndDTO saasTaskStartOrEndDTO) {
        LambdaUpdateWrapper<SaasTask> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(SaasTask::getId, saasTaskStartOrEndDTO.getId());
        updateWrapper.set(SaasTask::getTaskStatus, saasTaskStartOrEndDTO.getTaskStatus());
        update(updateWrapper);
    }
    public IPage<SaasTaskBasicsVO> pageStar(SaasTaskBasicsDTO saasTaskBasicsDTO) {
        return baseMapper.pageStar(saasTaskBasicsDTO.toMp(), saasTaskBasicsDTO);
    }
    public void submitAudit(Long taskId) {
        this.lambdaUpdate().eq(SaasTask::getId, taskId).set(SaasTask::getTaskConfiguration, SaasTaskConfigurationEnum.UNDER_REVIEW).update();
    }
    public void revocation(Long taskId) {
        this.lambdaUpdate().eq(SaasTask::getId, taskId).set(SaasTask::getTaskConfiguration, SaasTaskConfigurationEnum.REVOCATION_OF_REVIEW).update();
    }

    /**
     * 获取数据库里面是否有该任务类型的存在
     * @param code
     * @return
     */
    public Boolean taskTypeExist(int code) {
        return SqlHelper.retBool(baseMapper.taskTypeExist(code));
    }
    public List<Long> getAllSaasUnclaimedTaskAwardId() {
        return baseMapper.getAllSaasUnclaimedTaskAwardId();
    }
}
